package nowCoder;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Scanner;

public class HJ25 {

    /*
输入描述：
    一组输入整数序列I和一组规则整数序列R，I和R序列的第一个整数为序列的个数（个数不包含第一个整数）；整数范围为0~(2^31)-1，序列个数不限
输出描述：
    从R依次中取出R<i>，对I进行处理，找到满足条件的I： 
    I整数对应的数字需要连续包含R<i>对应的数字。比如R<i>为23，I为231，那么I包含了R<i>，条件满足 。 
    按R<i>从小到大的顺序:
    (1)先输出R<i>； 
    (2)再输出满足条件的I的个数； 
    (3)然后输出满足条件的I在I序列中的位置索引(从0开始)； 
    (4)最后再输出I。 
附加条件： 
    (1)R<i>需要从小到大排序。相同的R<i>只需要输出索引小的以及满足条件的I，索引大的需要过滤掉 
    (2)如果没有满足条件的I，对应的R<i>不用输出 
    (3)最后需要在输出序列的第一个整数位置记录后续整数序列的个数(不包含“个数”本身)
 

序列I：15,123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123（第一个15表明后续有15个整数） 
序列R：5,6,3,6,3,0（第一个5表明后续有5个整数） 
输出：30, 3,6,0,123,3,453,7,3,9,453456,13,453,14,123,6,7,1,456,2,786,4,46,8,665,9,453456,11,456,12,786
     */
    public static void main1(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] i = new int[n];
        for(int ii = 0; ii<n; ii++){
            i[ii] = in.nextInt();
        }
        int m = in.nextInt();
        int[] r = new int[m];
        for(int ii = 0 ; ii<m; ii++){
            r[ii] = in.nextInt();
        }
        Arrays.sort(r);
        int num = 0;
        LinkedHashMap<Integer, List<Integer>> map = new LinkedHashMap<>();
        for(int ii = 0 ; ii < m ; ii ++){
            if(ii != 0 && r[ii] == r[ii-1]) continue;
            for(int j = 0 ; j < n ; j ++){
                if(String.valueOf(i[j]).contains(String.valueOf(r[ii]))){
                   List<Integer> il = map.get(r[ii]) == null ? new LinkedList<Integer>(): map.get(r[ii]);
                   il.add(j);
                   il.add(i[j]); 
                   map.put(r[ii],il);
                   num++;
                }
            }
        }
        System.out.print((map.size() + num)* 2 +" ");
        for(Map.Entry<Integer,List<Integer>> mm : map.entrySet()){
            System.out.print(mm.getKey()+" ");
            System.out.print(mm.getValue().size() / 2 + " ");
            for(Integer aa : mm.getValue()){
                System.out.print(aa+" ");
            }
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int a = in.nextInt();
        String[] ii = new String[a];
        for(int i = 0; i< a; i++){
            ii[i] = in.next();
        }
        int b = in.nextInt();
        ArrayList<Integer> rr = new ArrayList<>();
        for(int i = 0; i< b; i++){
            rr.add(in.nextInt());
        }
        rr.sort(null);
        ArrayList<Integer> z = new ArrayList<>();
        for(int i = 0 ; i< b; i++){
            if (i != 0 && Objects.equals(rr.get(i), rr.get(i - 1))){
                continue;
            }
            boolean p = false;
            int q = 0;
            for(int j = 0 ;j < a; j ++){
                if(ii[j].contains(String.valueOf(rr.get(i)))){
                    if(!p){
                        z.add(rr.get(i));
                        // 占位，统计完后需要覆盖
                        z.add(0);
                        p = true;
                    }
                    q++;
                    z.add(j);
                    z.add(Integer.parseInt(ii[j]));
                }
            }
            // 当有符合条件的值时，需要修改预备的占位数为符合条件的数量
            if(q > 0)
                z.set(z.size()-1-q-q,q);
        }
        System.out.print(z.size());
        for(int i = 0; i< z.size(); i++){
            System.out.print(" "+z.get(i));
        }
    }
}
